const axios = require('axios');

class SaoBeiPayClient {
  constructor(baseUrl = 'http://pay.lcsw.cn/lcsw') {
    this.baseUrl = baseUrl;
  }

  /**
   * 生成签名
   * @param {Object} params 请求参数
   * @param {string} keySign 签名密钥
   * @returns {string} 签名
   */
  generateKeySign(params, keySign) {
    // 1. 参数按照键名ASCII码升序排序
    const sortedKeys = Object.keys(params).sort();
    
    // 2. 拼接参数字符串
    const signStr = sortedKeys
      .filter(key => key !== 'key_sign' && params[key]) // 过滤空值和key_sign
      .map(key => `${key}=${params[key]}`)
      .join('&') + `&access_token=${keySign}`;
    
    // 3. MD5加密并转大写
    return require('crypto')
      .createHash('md5')
      .update(signStr)
      .digest('hex')
      .toUpperCase();
  }

   /**
   * 生成16位终端流水号
   * @returns {string}
   */
   static generateTerminalTrace() {
    const timestamp = Date.now().toString();
    const random = Math.floor(Math.random() * 10000).toString().padStart(4, '0');
    return (timestamp + random).slice(-16);
  }

  /**
   * 查询订单
   * @param {Object} params 查询参数
   * @param {string} params.merchant_no 商户号
   * @param {string} params.terminal_id 终端号
   * @param {string} params.key_sign 签名密钥
   * @param {string} params.out_trade_no 商户订单号
   * @returns {Promise<Object>} 订单查询结果
   */
  async queryOrder(params) {
    try {
      const { merchant_no, terminal_id, key_sign, out_trade_no } = params;
      
      const requestParams = {
        merchant_no,
        terminal_id,
        out_trade_no,
        terminal_trace: SaoBeiPayClient.generateTerminalTrace(), // 使用订单号加时间戳作为流水号
        terminal_time: SaoBeiPayClient.formatDate(), // 使用当前时间
        pay_ver: '202', // 添加支付版本号
		pay_type: '000',
		service_id: '020',
      };

      // 生成签名
      requestParams.key_sign = this.generateKeySign(requestParams, key_sign);

      // 发送请求
      console.log('Query order params:', JSON.stringify(requestParams));
      const response = await axios.post(
        `${this.baseUrl}/pay/open/query`,
        requestParams
      );

      if (!response.data) {
        throw new Error('查询订单失败: 无响应数据');
      }
      return response.data;
    } catch (error) {
      console.error('Query order failed:', error);
      throw new Error('查询订单失败: ' + (error.response?.data?.msg || error.message));
    }
  }

  /**
   * 格式化日期为YYYYMMDDHHmmss
   * @returns {string}
   */
  static formatDate() {
    const date = new Date();
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    const hours = String(date.getHours()).padStart(2, '0');
    const minutes = String(date.getMinutes()).padStart(2, '0');
    const seconds = String(date.getSeconds()).padStart(2, '0');
    return `${year}${month}${day}${hours}${minutes}${seconds}`;
  }
}

module.exports = SaoBeiPayClient;
